// 引入一个兼容性好但可能速度稍慢的日期库（例如date-fns或moment.js，这里假设使用date-fns）
// import { parseISO, differenceInMinutes } from 'date-fns';

// 缓存解析值，加速解析过程

const cacheParseTime = (function() {
    let cacheString: { [key: string]: string } = {};
    let cacheValue: { [key: string]: Date } = {};
    let count = 0;

    return function(timeName: string, timeString: string): Date {
        if (cacheString[timeName] !== timeString) {
            // 避免缓存过多对象
            if (count++ > 10000) {
                cacheString = {};
                cacheValue = {};
            }
            cacheString[timeName] = timeString;
            return (cacheValue[timeName] = parseTime(timeString));
        }

        return cacheValue[timeName];
    };
})();

/**
 * 根据配置项计算两个时间在甘特图中的长度
 * 注：时间上start早，end晚
 *
 * @param {string} start - 开始时间字符串
 * @param {string} end - 结束时间字符串
 * @param {{ scale: number, cellWidth: number }} arg - 配置项
 * @returns {number} - 长度（像素）
 */
export function getWidthAbout2Times(
    start: string,
    end: string,
    arg: { scale: number; cellWidth: number }
): number {
    const { scale, cellWidth } = arg;
    const pStart = cacheParseTime("pStart", start);
    const pEnd = parseTime(end);
    return (diffTimeByMinutes(pStart, pEnd) / scale) * cellWidth;
}

/**
 * 根据配置项计算相对于时间轴起始时间的距离
 * 注：时间上，time晚  beginTimeOfTimeLine早
 *
 * @param {string} time - 时间字符串
 * @param {string} beginTimeOfTimeLine - 时间轴起始时间字符串
 * @param {{ scale: number, cellWidth: number }} arg - 配置项
 * @returns {number} - 距离（像素）
 */
export function getPositionOffset(
    time: string,
    beginTimeOfTimeLine: string,
    arg: { scale: number; cellWidth: number }
): number {
    const { scale, cellWidth } = arg;
    const pTime = cacheParseTime("pTime", time);
    const pBeginTimeOfTimeLine = cacheParseTime(
        "pBeginTimeOfTimeLine",
        beginTimeOfTimeLine
    );
    return (diffTimeByMinutes(pBeginTimeOfTimeLine, pTime) / scale) * cellWidth;
}

function parseTime(time: string): Date {
    // 使用Date对象解析时间字符串
    return new Date(time);
    // 如果使用date-fns，可以这样写：
    // return parseISO(time);
}

/**
 * 计算两个时间相差的分钟数
 *
 * @param {Date} start - 开始时间
 * @param {Date} end - 结束时间
 * @returns {number} - 相差的分钟数
 */
function diffTimeByMinutes(start: Date, end: Date): number {
    const diff = end.getTime() - start.getTime();
    return diff / 1000 / 60;
    // 如果使用date-fns，可以这样写：
    // return differenceInMinutes(start, end);
}
